﻿
namespace SimpleExpression
{
    public class ColumnSetExpression : Expression
    {
        private AttributeExpressionCollection attributes = null;
        private EntityMetadata entityMetadata;

        //XML Required
        public ColumnSetExpression()
        { 
        
        }

        public ColumnSetExpression(EntityMetadata entityMetadata)
        {
            this.entityMetadata = entityMetadata;
            this.attributes = new AttributeExpressionCollection();
        }

        public AttributeExpressionCollection Attributes
        {
            get
            {
                return this.attributes;
            }
        }

        public void AddAllColumns()
        {
            foreach (PropertyMetadata propertyMetadata in this.entityMetadata.Properties)
            {
                // Se agrega el campo como un attribute expression con el luego se generara el physical name
                this.attributes.Add(new AttributeExpression(propertyMetadata));

                // Si el physical es diferente del platform se agrega otro attribute expression
                // Verificar que no se agregue dos veces el mismo platform name en caso que 
                // el primary key tenga referenciado un mismo campo que esta como physical
                if (propertyMetadata.PhysicalName != propertyMetadata.PlatformName && !this.entityMetadata.Properties.Contains(propertyMetadata.PlatformName, MappingType.Physical))
                    this.attributes.Add(new ViewAttributeExpression(propertyMetadata));
            }
        }

        #region Expression

        public override void Accept(ExpressionVisitor visitor)
        {
            visitor.Visit(this);
        }

        #endregion
    }
}
